<?php
// +----------------------------------------------------------------------
// | 模型
// +----------------------------------------------------------------------
declare(strict_types=1);

namespace app\model;

use think\Model;
use think\db\Query;

/**
 * 系统用户操作模型
 *
 * Class SystemUsersLogsModel
 * @package app\model
 * @OA\Schema(
 *   schema="MineSystemUsersLogs",
 *   type="object",
 *   @OA\Property(description="ID", property="id", type="integer", example=1),
 *   @OA\Property(description="类型", property="type", type="string", example="类型"),
 *   @OA\Property(description="信息摘要", property="summary", type="string", example="摘要"),
 *   @OA\Property(description="请求UA", property="userAgent", type="object", example={"system": "Windows 10", "browser": "Chrome"}),
 *   @OA\Property(description="IP地址", property="ipAddress", type="string", example="127.0.0.1"),
 *   @OA\Property(description="IP归属", property="ipLocation", type="string", example="中国"),
 *   @OA\Property(description="创建时间", property="createTime", type="string", format="date-time", example="2024-01-01T12:00:00Z"),
 *   @OA\Property(description="更新时间", property="updateTime", type="string", format="date-time", example="2024-01-02T12:00:00Z")
 * )
 */
class SystemUsersLogsModel extends Model
{
    // 设置表名
    protected $name = 'system_users_logs';
    // 设置字段信息
    protected $schema = [
        'id'           => 'int',
        // 类型
        'type'         => 'string',
        // 用户ID
        'user_id'      => 'int',
        // 信息摘要
        'summary'      => 'string',
        // 请求地址
        'url'          => 'string',
        // 请求类型
        'method'       => 'string',
        // 请求参数
        'body'         => 'json',
        // 请求UA
        'user_agent'   => 'string',
        // 用户详情
        'user_info'    => 'json',
        // IP地址
        'ip_address'   => 'string',
        // IP归属
        'ip_location'  => 'string',
        // 创建时间
        'create_time'  => 'datetime',
        // 更新时间
        'update_time'  => 'datetime',
    ];
    // 设置json类型字段
    protected $json = ['body', 'user_info'];
    // 设置JSON数据返回数组
    protected $jsonAssoc = true;
    // 模型数据不区分大小写
    protected $strict = false;
    // 数据转换为驼峰命名
    protected $convertNameToCamel = true;

    /**
     * 获取完整数据（包含关联与排序）
     * 
     * @return Query
     */
    static public function queryOrder()
    {
        return self::order([
            'id'   => 'desc'
        ])->hidden(['user_id', 'url', 'method', 'body', 'user_info']);
    }

    /**
     * 搜索器 - 用户
     * 
     * @param Query $query 请求
     * @param mixed $value 字段值
     * @param array $data 完整数据
     * @return
     */
    public function searchUidAttr($query, $value, $data)
    {
        $query->where('user_id', $value);
    }

    /**
     * 获取器 - 操作系统
     *
     * @param mixed $value
     * @return array
     */
    public function getUserAgentAttr($value)
    {
        if (strpos($value, 'MSIE') !== false) {
            $browser = 'IE浏览器';
        } elseif (strpos($value, 'Trident') !== false) {
            $browser = 'IE浏览器';
        } elseif (strpos($value, 'Firefox') !== false) {
            $browser = '火狐浏览器';
        } elseif (strpos($value, 'Chrome') !== false) {
            $browser = 'Chrome';
        } elseif (strpos($value, 'Safari') !== false) {
            $browser = 'Safari';
        } elseif (strpos($value, 'Opera') !== false) {
            $browser = 'Opera';
        } elseif (strpos($value, 'OPR') !== false) {
            $browser = 'Opera';
        } else {
            $browser = '未知';
        }
        if (strpos($value, 'Windows NT 10.0') !== false) {
            $system = 'Windows 10';
        } elseif (strpos($value, 'Windows NT 6.3') !== false) {
            $system = 'Windows 8.1';
        } elseif (strpos($value, 'Windows NT 6.2') !== false) {
            $system = 'Windows 8';
        } elseif (strpos($value, 'Windows NT 6.1') !== false) {
            $system = 'Windows 7';
        } elseif (strpos($value, 'Windows NT 6.0') !== false) {
            $system = 'Windows Vista';
        } elseif (strpos($value, 'Windows NT 5.1') !== false) {
            $system = 'Windows XP';
        } elseif (strpos($value, 'Macintosh') !== false) {
            $system = 'Mac OS';
        } elseif (strpos($value, 'Linux') !== false) {
            $system = 'Linux';
        } elseif (strpos($value, 'Android') !== false) {
            $system = 'Android';
        } elseif (strpos($value, 'iPhone') !== false) {
            $system = 'iOS';
        } else {
            $system = '未知';
        }
        return [
            'system' => $system,
            'browser' => $browser
        ];
    }
}
